// 不明确某个变量为什么类型时， 可以断定他是什么类型（手动判断）

let el: HTMLBodyElement | null = document.querySelector("body");

//  HTMLBodyElement 为ts内部定义好的类型 操作dom时默认 为 HTMLBodyElement | null
// if(el){ 写在if判断中可成功编译
//   ...
// }

//  ! 是ts中的一个标致 非空断言  如果为空后果需自己负责
el!.style.width = "100px";
// el?.style.width = "100px"; // error  可选链不能代替断言

// ts 中联合类型===取并集     取值=== 取交集
type IValue = number | string | HTMLBodyElement; // 联合类型只能使用共享方法 非共享不能使用
// val = 123; // 交集

function getVal(el: IValue) {
  // (el as boolean).querySelector("root"); error  不能断言不存在的
  el as any as boolean; // 可以多次对同一个变量断言
  (el as HTMLBodyElement).querySelector("root");
  (<HTMLBodyElement>el).querySelector("root"); //强制转换等同as 可能会和js冲突 推荐as
}

// 除了基本类型 还可以字面量类型

type IA = 1;
// let a1:IA = 2  error
let a2: IA = 1;
type direction = "up" | "down" | 1 | true;
let d1: direction = "up";
let d2: direction = 1;
let d3: direction = true;

// 枚举的单一性 枚举之间不可相互赋值

enum A {}
enum B {}
let a: A;
let b: B;
//  a= b error 不能将类型B赋值给类型A

export {};
